package com.ruoyi.system.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.vo.BalanceVo;
import com.ruoyi.system.mapper.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.domain.vo.SuperBalanceVo;
import com.ruoyi.system.service.ISuperBalanceService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * 用户余额Service业务层处理
 * 实现用户余额管理的核心业务逻辑
 * 
 * @author ruoyi
 * @date 2025-08-14
 */
@Service
public class SuperBalanceServiceImpl implements ISuperBalanceService 
{
    @Autowired
    private SuperBalanceMapper superBalanceMapper;
    @Resource
    private SuperBalanceDetailMapper superBalanceDetailMapper;
    @Autowired
    private SuperPointMapper superPointMapper;
    @Autowired
    private SuperPointDetailMapper superPointDetailMapper;
    @Autowired
    private SuperOrdersMapper superOrdersMapper;

    /**
     * 查询用户余额
     * 
     * @param id 用户余额主键
     * @return 用户余额
     */
    @Override
    public SuperBalance selectSuperBalanceById(Long id)
    {
        return superBalanceMapper.selectSuperBalanceById(id);
    }

    /**
     * 根据用户ID查询余额信息
     * 业务说明：用于快速查询指定用户的余额信息，常用于用户登录后显示余额
     * 实现逻辑：直接调用Mapper层方法，根据用户ID查询余额记录
     * 
     * @param userId 用户ID
     * @return 用户余额记录，如果用户没有余额记录则返回null
     */
    @Override
    public SuperBalance selectSuperBalanceByUserId(Long userId)
    {
        return superBalanceMapper.selectSuperBalanceByUserId(userId);
    }

    /**
     * 查询用户余额列表
     * 
     * @param superBalance 用户余额查询条件
     * @return 用户余额列表
     */
    @Override
    public List<SuperBalance> selectSuperBalanceList(SuperBalance superBalance)
    {
        return superBalanceMapper.selectSuperBalanceList(superBalance);
    }

    /**
     * 查询用户余额列表（包含用户信息）
     * 业务说明：通过关联查询获取余额信息和用户基本信息，用于管理后台显示
     * 包含的信息：用户昵称、用户账号、余额数量、创建时间、更新时间等
     * 实现逻辑：调用Mapper层方法，执行JOIN查询获取完整信息
     * 
     * @param superBalance 用户余额查询条件
     * @return 包含用户信息的余额VO集合
     */
    @Override
    public List<SuperBalanceVo> selectSuperBalanceVoList(SuperBalance superBalance)
    {
        return superBalanceMapper.selectSuperBalanceVoList(superBalance);
    }

    /**
     * 新增用户余额
     * 
     * @param superBalance 用户余额
     * @return 结果
     */
    @Override
    public int insertSuperBalance(SuperBalance superBalance)
    {
        return superBalanceMapper.insertSuperBalance(superBalance);
    }

    /**
     * 修改用户余额
     * 
     * @param superBalance 用户余额
     * @return 结果
     */

    @Override
    public int updateSuperBalance(SuperBalance superBalance)
    {
        return superBalanceMapper.updateSuperBalance(superBalance);
    }

    /**
     * 增加用户余额
     * 业务说明：用于用户获得余额时的业务场景，如充值、退款、活动奖励等
     * 实现逻辑：直接在现有余额基础上增加指定数量，无上限限制
     * 安全考虑：在SQL层面进行余额操作，确保数据一致性
     * 
     * @param userId 用户ID
     * @param balance 增加的余额数（建议传入正数）
     * @return 影响的行数，1表示成功，0表示用户不存在余额记录
     */
    @Override
    @Transactional
    public int increaseUserBalance(Long userId, java.math.BigDecimal balance)
    {
        // 增加用户余额
        int i =  superBalanceMapper.increaseUserBalance(userId, balance);
        SuperBalanceDetail detail = new SuperBalanceDetail();
        detail.setUserId(userId);
        detail.setStatus(0);
        detail.setNumber(balance.intValue());
        detail.setTime(new Date());
        i*=superBalanceDetailMapper.insertSuperBalanceDetail(detail);
        // 在用户余额明细表进行记录
        return i;
    }

    /**
     * 减少用户余额
     * 业务说明：用于用户消费余额时的业务场景，如购物、扣费、余额兑换等
     * 实现逻辑：确保余额不会变为负数，如果余额不足则操作失败
     * 安全考虑：在SQL层面进行余额检查，防止余额变为负数
     * 
     * @param userId 用户ID
     * @param balance 减少的余额数（建议传入正数）
     * @return 影响的行数，1表示成功，0表示余额不足或用户不存在
     */
    @Override
    @Transactional
    public int decreaseUserBalance(Long userId, java.math.BigDecimal balance, BalanceVo balanceVo)
    {
        int totalAffected = 0;
        // 用户余额修改余额值
        int balanceAffected = superBalanceMapper.decreaseUserBalance(userId, balance);
        totalAffected += balanceAffected;
        // 在用户余额明细表进行记录
        SuperBalanceDetail detail = new SuperBalanceDetail();
        detail.setUserId(userId);
        detail.setStatus(1);
        detail.setNumber(balance.intValue());
        int balanceDetailAffected = superBalanceDetailMapper.insertSuperBalanceDetail(detail);
        totalAffected += balanceDetailAffected;
        // 在用户积分表进行记录
        SuperPointDetail pointDetail = new SuperPointDetail();
        pointDetail.setUserId(userId);
        pointDetail.setStatus(0L);
        pointDetail.setPoint(balance.longValue());
        int pointDetailAffected = superPointDetailMapper.insertSuperPointDetail(pointDetail);
        totalAffected += pointDetailAffected;
        // 在用户积分表修改积分值
        SuperPoint getPoint = superPointMapper.selectSuperPointByUserId(userId);
        Long point = getPoint.getPoint();
        getPoint.setPoint(point+balance.longValue());
        int superPointAttached =  superPointMapper.updateSuperPoint(getPoint);
        totalAffected += superPointAttached;
        // 支付成功之后修改订单状态为1
        SuperOrders orders = superOrdersMapper.selectSuperOrdersById(balanceVo.getOrderId());
        orders.setStatus(1);
        orders.setPayId(1L);
        int superOrdersAttached = superOrdersMapper.updateSuperOrders(orders);
        totalAffected += superOrdersAttached;
        return totalAffected;
    }

    /**
     * 批量删除用户余额
     * 
     * @param ids 需要删除的用户余额主键
     * @return 结果
     */
    @Override
    public int deleteSuperBalanceByIds(Long[] ids)
    {
        return superBalanceMapper.deleteSuperBalanceByIds(ids);
    }

    /**
     * 删除用户余额信息
     * 
     * @param id 用户余额主键
     * @return 结果
     */
    @Override
    public int deleteSuperBalanceById(Long id)
    {
        return superBalanceMapper.deleteSuperBalanceById(id);
    }
}
